using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

        public FornecedorVO getFornecedor(int? idFornecedor, int? idPessoa, int? idFilial)
		{
			FornecedorVO fornecedorVO = null;
			List<FornecedorVO> listFornecedorVOs = getFornecedors(idFornecedor, idPessoa, idFilial);
			if (listFornecedorVOs != null && listFornecedorVOs.Count > 0)
			{
				fornecedorVO = listFornecedorVOs[0];
			}
			return fornecedorVO;
		}

        public FornecedorVO getFornecedor(int? idFornecedor, int? idPessoa)
        {
            return getFornecedor(idFornecedor, idPessoa, null);
        }

        public FornecedorVO getFornecedor(int? idFornecedor)
        {
            return getFornecedor(idFornecedor, null);
        }

		public List<FornecedorVO> getFornecedors()
		{
			return getFornecedors(null, null);
		}

		public List<FornecedorVO> getFornecedors(int? idFornecedor)
		{
			return getFornecedors(idFornecedor, null);
		}

        public List<FornecedorVO> getFornecedors(int? idFornecedor, int? idPessoa)
        {
            return getFornecedors(idFornecedor, idPessoa, null);
        }

        public List<FornecedorVO> getFornecedors(int? idFornecedor, int? idPessoa, int? idFilial)
        {
            return getFornecedors(idFornecedor, idPessoa, idFilial, null);
        }

		public List<FornecedorVO> getFornecedors(int? idFornecedor, int? idPessoa, int? idFilial, string pessoa)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT frn.idFornecedor as frn_idFornecedor, frn.idPessoa as frn_idPessoa, pes.pessoa as pes_pessoa, frn.cadastro as frn_cadastro, frn.cadastradoPor as frn_cadastradoPor, frn.edicao as frn_edicao, frn.editadoPor as frn_editadoPor  ");
            query.AppendLine("FROM fornecedor as frn ");
            query.AppendLine(" LEFT OUTER JOIN pessoa as pes on frn.idPessoa=pes.idPessoa  ");
            query.AppendLine("  LEFT OUTER JOIN filial as fil on pes.idFilial=fil.idFilial  ");
			if (idFornecedor != null)
			{
				query.AppendLine(where + "frn.idFornecedor=@idFornecedor ");
				where = "AND ";
			}
			if (idPessoa != null)
			{
				query.AppendLine(where + "frn.idPessoa=@idPessoa ");
				where = "AND ";
			}
            if (idFilial != null)
            {
                query.AppendLine(where + "pes.idFilial=@idFilial ");
                where = "AND ";
            }
            if (pessoa != null)
            {
                query.AppendLine(where + "pes.pessoa LIKE @pessoa ");
                where = "AND ";
            }


			query.AppendLine("ORDER BY frn.idFornecedor ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			if (idFornecedor!= null) cmd.Parameters.Add(getParameter(cmd, "@idFornecedor", idFornecedor));
			if (idPessoa!= null) cmd.Parameters.Add(getParameter(cmd, "@idPessoa", idPessoa));
            if (idFilial != null) cmd.Parameters.Add(getParameter(cmd, "@idFilial", idFilial));
            if (pessoa != null) cmd.Parameters.Add(getParameter(cmd, "@pessoa", "%" + pessoa + "%"));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<FornecedorVO> listFornecedor = new List<FornecedorVO>();

				while (reader.Read())
				{
					FornecedorVO fornecedorVO = FornecedorVO.CreateVO();
					fornecedorVO.idFornecedor = reader.GetInt32(reader.GetOrdinal("frn_idFornecedor"));
					fornecedorVO.idPessoa = reader.GetInt32(reader.GetOrdinal("frn_idPessoa"));
					if (!reader.IsDBNull(reader.GetOrdinal("pes_pessoa")))
						fornecedorVO.idPessoaVO.pessoa = reader.GetString(reader.GetOrdinal("pes_pessoa"));
					fornecedorVO.cadastro = reader.GetDateTime(reader.GetOrdinal("frn_cadastro"));
					fornecedorVO.cadastradoPor = reader.GetString(reader.GetOrdinal("frn_cadastradoPor"));
					fornecedorVO.edicao = reader.GetDateTime(reader.GetOrdinal("frn_edicao"));
					fornecedorVO.editadoPor = reader.GetString(reader.GetOrdinal("frn_editadoPor"));


					listFornecedor.Add(fornecedorVO);
				}
				reader.Close();
				return listFornecedor;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setFornecedor(FornecedorVO fornecedorVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE fornecedor ");
			query.AppendLine("SET idPessoa=@idPessoa,  cadastro=@cadastro, cadastradoPor=@cadastradoPor, edicao=@edicao, editadoPor=@editadoPor ");
			query.AppendLine("WHERE idFornecedor=@idFornecedor ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idFornecedor", fornecedorVO.idFornecedor));
			cmd.Parameters.Add(getParameter(cmd, "@idPessoa", fornecedorVO.idPessoa));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", fornecedorVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", fornecedorVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", fornecedorVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", fornecedorVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newFornecedor(FornecedorVO fornecedorVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO fornecedor ");
			query.AppendLine("  ( idPessoa, cadastro, cadastradoPor, edicao, editadoPor ) ");
			query.AppendLine("VALUES ( @idPessoa, @cadastro, @cadastradoPor, @edicao, @editadoPor ) ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPessoa", fornecedorVO.idPessoa));
			cmd.Parameters.Add(getParameter(cmd, "@cadastro", fornecedorVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@cadastradoPor", fornecedorVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@edicao", fornecedorVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@editadoPor", fornecedorVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('fornecedor') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delFornecedor(FornecedorVO fornecedorVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM fornecedor ");
			query.AppendLine("WHERE idFornecedor=@idFornecedor ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idFornecedor", fornecedorVO.idFornecedor));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountFornecedorxIdPessoa(int? idPessoa)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idPessoa) as ocorrencias FROM fornecedor WHERE IdPessoa=@IdPessoa ");

			DbCommand cmd = this.getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdPessoa", idPessoa));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
